{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Notebook for generating and saving SBM CLUSTER graphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import pickle\n",
    "import time\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.sparse\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Generate SBM CLUSTER graphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'nb_clusters': 6, 'size_min': 5, 'size_max': 35, 'p': 0.55, 'q': 0.25}\n",
      "<__main__.generate_SBM_graph object at 0x12e387dd0>\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def schuffle(W,c):\n",
    "    # relabel the vertices at random\n",
    "    idx=np.random.permutation( W.shape[0] )\n",
    "    #idx2=np.argsort(idx) # for index ordering wrt classes\n",
    "    W_new=W[idx,:]\n",
    "    W_new=W_new[:,idx]\n",
    "    c_new=c[idx]\n",
    "    return W_new , c_new , idx \n",
    "\n",
    "\n",
    "def block_model(c,p,q):\n",
    "    n=len(c)\n",
    "    W=np.zeros((n,n))\n",
    "    for i in range(n):\n",
    "        for j in range(i+1,n):\n",
    "            if c[i]==c[j]:\n",
    "                prob=p\n",
    "            else:\n",
    "                prob=q\n",
    "            if np.random.binomial(1,prob)==1:\n",
    "                W[i,j]=1\n",
    "                W[j,i]=1     \n",
    "    return W\n",
    "\n",
    "\n",
    "def unbalanced_block_model(nb_of_clust, clust_size_min, clust_size_max, p, q):  \n",
    "    c = []\n",
    "    for r in range(nb_of_clust):\n",
    "        if clust_size_max==clust_size_min:\n",
    "            clust_size_r = clust_size_max\n",
    "        else:\n",
    "            clust_size_r = np.random.randint(clust_size_min,clust_size_max,size=1)[0]\n",
    "        val_r = np.repeat(r,clust_size_r,axis=0)\n",
    "        c.append(val_r)\n",
    "    c = np.concatenate(c)  \n",
    "    W = block_model(c,p,q)  \n",
    "    return W,c\n",
    "\n",
    "\n",
    "class generate_SBM_graph():\n",
    "\n",
    "    def __init__(self, SBM_parameters): \n",
    "\n",
    "        # parameters\n",
    "        nb_of_clust = SBM_parameters['nb_clusters']\n",
    "        clust_size_min = SBM_parameters['size_min']\n",
    "        clust_size_max = SBM_parameters['size_max']\n",
    "        p = SBM_parameters['p']\n",
    "        q = SBM_parameters['q']\n",
    "\n",
    "        # block model\n",
    "        W, c = unbalanced_block_model(nb_of_clust, clust_size_min, clust_size_max, p, q)\n",
    "        \n",
    "        # shuffle\n",
    "        W, c, idx = schuffle(W,c)\n",
    "        \n",
    "        # signal on block model\n",
    "        u = np.zeros(c.shape[0])\n",
    "        for r in range(nb_of_clust):\n",
    "            cluster = np.where(c==r)[0]\n",
    "            s = cluster[np.random.randint(cluster.shape[0])]\n",
    "            u[s] = r+1\n",
    "\n",
    "        # target\n",
    "        target = c\n",
    "        \n",
    "        # convert to pytorch\n",
    "        W = torch.from_numpy(W)\n",
    "        W = W.to(torch.int8)\n",
    "        idx = torch.from_numpy(idx) \n",
    "        idx = idx.to(torch.int16)\n",
    "        u = torch.from_numpy(u) \n",
    "        u = u.to(torch.int16)                      \n",
    "        target = torch.from_numpy(target)\n",
    "        target = target.to(torch.int16)\n",
    "        \n",
    "        # attributes\n",
    "        self.nb_nodes = W.size(0)\n",
    "        self.W = W\n",
    "        self.rand_idx = idx\n",
    "        self.node_feat = u\n",
    "        self.node_label = target\n",
    "        \n",
    "\n",
    "    \n",
    "    \n",
    "    \n",
    "# configuration   \n",
    "SBM_parameters = {}\n",
    "SBM_parameters['nb_clusters'] = 6 \n",
    "SBM_parameters['size_min'] = 5 \n",
    "SBM_parameters['size_max'] = 35 \n",
    "SBM_parameters['p'] = 0.55 \n",
    "SBM_parameters['q'] = 0.25 \n",
    "print(SBM_parameters)\n",
    "    \n",
    "\n",
    "data = generate_SBM_graph(SBM_parameters)\n",
    "\n",
    "print(data)\n",
    "#print(data.nb_nodes)\n",
    "#print(data.W)\n",
    "#print(data.rand_idx)\n",
    "#print(data.node_feat)\n",
    "#print(data.node_label)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plot Adj matrix\n",
    "\n",
    "W = data.W\n",
    "plt.spy(W,precision=0.01, markersize=1)\n",
    "plt.show()\n",
    "\n",
    "idx = np.argsort(data.rand_idx) \n",
    "W = data.W\n",
    "W2 = W[idx,:]\n",
    "W2 = W2[:,idx]\n",
    "plt.spy(W2,precision=0.01, markersize=1)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "250\n",
      "500\n",
      "750\n",
      "1000\n",
      "1250\n",
      "1500\n",
      "1750\n",
      "2000\n",
      "2250\n",
      "2500\n",
      "2750\n",
      "3000\n",
      "3250\n",
      "3500\n",
      "3750\n",
      "4000\n",
      "4250\n",
      "4500\n",
      "4750\n",
      "5000\n",
      "5250\n",
      "5500\n",
      "5750\n",
      "6000\n",
      "6250\n",
      "6500\n",
      "6750\n",
      "7000\n",
      "7250\n",
      "7500\n",
      "7750\n",
      "8000\n",
      "8250\n",
      "8500\n",
      "8750\n",
      "9000\n",
      "9250\n",
      "9500\n",
      "9750\n",
      "10000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "250\n",
      "500\n",
      "750\n",
      "1000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "250\n",
      "500\n",
      "750\n",
      "1000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time (sec): 190.9908800125122\n"
     ]
    }
   ],
   "source": [
    "# Generate and save SBM graphs\n",
    "\n",
    "class DotDict(dict):\n",
    "    def __init__(self, **kwds):\n",
    "        self.update(kwds)\n",
    "        self.__dict__ = self\n",
    "\n",
    "def generate_semisuperclust_dataset(nb_graphs):\n",
    "    dataset = []\n",
    "    for i in range(nb_graphs):\n",
    "        if not i%250:\n",
    "            print(i)\n",
    "        data = generate_SBM_graph(SBM_parameters)\n",
    "        graph = DotDict()\n",
    "        graph.nb_nodes = data.nb_nodes\n",
    "        graph.W = data.W\n",
    "        graph.rand_idx = data.rand_idx\n",
    "        graph.node_feat = data.node_feat\n",
    "        graph.node_label = data.node_label\n",
    "        dataset.append(graph)\n",
    "    return dataset\n",
    "\n",
    "def plot_histo_graphs(dataset, title):\n",
    "    # histogram of graph sizes\n",
    "    graph_sizes = []\n",
    "    for graph in dataset:\n",
    "        graph_sizes.append(graph.nb_nodes)\n",
    "    plt.figure(1)\n",
    "    plt.hist(graph_sizes, bins=50)\n",
    "    plt.title(title)\n",
    "    plt.show()\n",
    "     \n",
    "def SBMs_CLUSTER(nb_graphs, name):\n",
    "    dataset = generate_semisuperclust_dataset(nb_graphs)\n",
    "    print(len(dataset))\n",
    "    with open(name+'.pkl',\"wb\") as f:\n",
    "        pickle.dump(dataset,f)\n",
    "    plot_histo_graphs(dataset,name)\n",
    "    \n",
    "\n",
    "\n",
    "\n",
    "start = time.time()\n",
    "\n",
    "nb_graphs = 10000 # train\n",
    "#nb_graphs = 3333 # train\n",
    "#nb_graphs = 500 # train\n",
    "#nb_graphs = 20 # train\n",
    "SBMs_CLUSTER(nb_graphs, 'SBM_CLUSTER_train')\n",
    "    \n",
    "nb_graphs = 1000 # val\n",
    "#nb_graphs = 333 # val\n",
    "#nb_graphs = 100 # val\n",
    "#nb_graphs = 5 # val\n",
    "SBMs_CLUSTER(nb_graphs, 'SBM_CLUSTER_val')\n",
    "\n",
    "    \n",
    "nb_graphs = 1000 # test\n",
    "#nb_graphs = 333 # test\n",
    "#nb_graphs = 100 # test\n",
    "#nb_graphs = 5 # test\n",
    "SBMs_CLUSTER(nb_graphs, 'SBM_CLUSTER_test')\n",
    "\n",
    "print('Time (sec):',time.time() - start) # 190s\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convert to DGL format and save with pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/Users/xbresson/Documents/Dropbox/06_NTU_2017_now/03_my_codes/34_benchmark20/GITHUB_benchmark_project/benchmarking-gnn\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "os.chdir('../../') # go to root folder of the project\n",
    "print(os.getcwd())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "import pickle\n",
    "\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "from data.SBMs import SBMsDatasetDGL \n",
    "\n",
    "from data.data import LoadData\n",
    "from torch.utils.data import DataLoader\n",
    "from data.SBMs import SBMsDataset\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[I] Loading data ...\n",
      "preparing 10000 graphs for the TRAIN set...\n",
      "preparing 1000 graphs for the TEST set...\n",
      "preparing 1000 graphs for the VAL set...\n",
      "[I] Finished loading.\n",
      "[I] Data load time: 3983.7924s\n",
      "Time (sec): 3983.794214248657\n"
     ]
    }
   ],
   "source": [
    "DATASET_NAME = 'SBM_CLUSTER'\n",
    "dataset = SBMsDatasetDGL(DATASET_NAME)  #3983s\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000\n",
      "1000\n",
      "1000\n",
      "(DGLGraph(num_nodes=117, num_edges=4104,\n",
      "         ndata_schemes={'feat': Scheme(shape=(), dtype=torch.int64)}\n",
      "         edata_schemes={'feat': Scheme(shape=(1,), dtype=torch.float32)}), tensor([0, 3, 3, 0, 4, 3, 0, 2, 0, 0, 0, 2, 2, 0, 1, 5, 3, 0, 2, 4, 2, 3, 2, 4,\n",
      "        3, 1, 3, 5, 2, 3, 0, 0, 3, 5, 2, 5, 3, 2, 0, 3, 0, 3, 3, 3, 0, 3, 2, 0,\n",
      "        3, 5, 2, 4, 1, 1, 3, 4, 4, 3, 3, 3, 0, 5, 2, 4, 3, 0, 0, 4, 3, 0, 0, 1,\n",
      "        4, 2, 3, 2, 0, 0, 0, 4, 2, 2, 3, 3, 3, 0, 0, 2, 2, 5, 4, 0, 2, 5, 4, 0,\n",
      "        0, 2, 0, 0, 0, 3, 3, 2, 2, 1, 2, 0, 0, 0, 5, 3, 1, 4, 3, 3, 5],\n",
      "       dtype=torch.int16))\n",
      "(DGLGraph(num_nodes=90, num_edges=2396,\n",
      "         ndata_schemes={'feat': Scheme(shape=(), dtype=torch.int64)}\n",
      "         edata_schemes={'feat': Scheme(shape=(1,), dtype=torch.float32)}), tensor([1, 0, 0, 4, 4, 0, 5, 3, 4, 0, 3, 1, 0, 5, 5, 5, 1, 3, 3, 4, 1, 2, 5, 4,\n",
      "        5, 5, 2, 0, 5, 3, 2, 5, 5, 5, 5, 0, 3, 3, 0, 2, 3, 3, 3, 3, 5, 3, 1, 1,\n",
      "        5, 2, 5, 1, 1, 4, 5, 2, 0, 4, 4, 0, 3, 4, 0, 0, 2, 3, 5, 3, 3, 4, 0, 5,\n",
      "        1, 0, 0, 0, 0, 2, 4, 0, 5, 0, 3, 0, 5, 3, 4, 3, 0, 5],\n",
      "       dtype=torch.int16))\n",
      "(DGLGraph(num_nodes=134, num_edges=5570,\n",
      "         ndata_schemes={'feat': Scheme(shape=(), dtype=torch.int64)}\n",
      "         edata_schemes={'feat': Scheme(shape=(1,), dtype=torch.float32)}), tensor([2, 5, 4, 4, 4, 5, 2, 1, 5, 0, 0, 1, 5, 5, 4, 2, 5, 5, 0, 0, 3, 0, 1, 2,\n",
      "        2, 5, 0, 2, 0, 5, 1, 5, 5, 1, 0, 0, 5, 2, 2, 5, 5, 1, 4, 0, 0, 5, 1, 0,\n",
      "        3, 0, 5, 1, 5, 4, 0, 4, 5, 1, 5, 4, 4, 0, 2, 5, 2, 5, 0, 1, 0, 1, 2, 0,\n",
      "        2, 2, 0, 3, 2, 4, 0, 5, 2, 0, 2, 2, 5, 4, 2, 0, 4, 0, 0, 5, 1, 0, 5, 3,\n",
      "        2, 3, 5, 0, 1, 5, 2, 0, 1, 4, 0, 3, 2, 1, 0, 2, 1, 4, 2, 5, 2, 0, 5, 2,\n",
      "        5, 5, 0, 1, 5, 4, 2, 2, 2, 0, 1, 0, 2, 1], dtype=torch.int16))\n"
     ]
    }
   ],
   "source": [
    "print(len(dataset.train))\n",
    "print(len(dataset.val))\n",
    "print(len(dataset.test))\n",
    "\n",
    "print(dataset.train[0])\n",
    "print(dataset.val[0])\n",
    "print(dataset.test[0])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time (sec): 15.637878656387329\n"
     ]
    }
   ],
   "source": [
    "start = time.time()\n",
    "\n",
    "with open('data/SBMs/SBM_CLUSTER.pkl','wb') as f:\n",
    "        pickle.dump([dataset.train,dataset.val,dataset.test],f)\n",
    "        \n",
    "print('Time (sec):',time.time() - start)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Test load function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[I] Loading dataset SBM_CLUSTER...\n",
      "train, test, val sizes : 10000 1000 1000\n",
      "[I] Finished loading.\n",
      "[I] Data load time: 29.6175s\n"
     ]
    }
   ],
   "source": [
    "DATASET_NAME = 'SBM_CLUSTER'\n",
    "dataset = LoadData(DATASET_NAME) # 29s\n",
    "trainset, valset, testset = dataset.train, dataset.val, dataset.test\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'data.SBMs.SBMsDataset'>\n",
      "Time (sec): 0.002402067184448242\n"
     ]
    }
   ],
   "source": [
    "start = time.time()\n",
    "\n",
    "batch_size = 10\n",
    "collate = SBMsDataset.collate\n",
    "print(SBMsDataset)\n",
    "train_loader = DataLoader(trainset, batch_size=batch_size, shuffle=True, collate_fn=collate)\n",
    "\n",
    "print('Time (sec):',time.time() - start) #0.002s\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
